"""
03 - Python 数据结构
与 Java 的主要差异：
1. 内置丰富的数据结构操作
2. 列表推导式、字典推导式
3. 切片操作
4. 元组（不可变列表）
"""

print("=== Python 数据结构 ===")

# 1. 列表 List (类似 Java ArrayList)
print("\n--- 列表 List ---")

# 创建列表
fruits = ["apple", "banana", "orange", "grape", "mango"]
numbers = [1, 2, 3, 4, 5]
mixed = [1, "hello", 3.14, True]

print(f"水果列表: {fruits}")
print(f"数字列表: {numbers}")
print(f"混合列表: {mixed}")

# 列表操作
print("\n--- 列表操作 ---")
fruits.append("pear")              # 添加元素
print(f"添加 pear: {fruits}")

fruits.insert(1, "kiwi")           # 插入元素
print(f"插入 kiwi: {fruits}")

fruits.remove("banana")            # 删除元素
print(f"删除 banana: {fruits}")

popped = fruits.pop()              # 弹出最后一个元素
print(f"弹出: {popped}, 剩余: {fruits}")

popped = fruits.pop(0)             # 弹出指定位置元素
print(f"弹出第一个: {popped}, 剩余: {fruits}")

# 列表切片 (Python 特色)
print("\n--- 列表切片 ---")
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(f"原始列表: {numbers}")
print(f"前3个: {numbers[:3]}")
print(f"后3个: {numbers[-3:]}")
print(f"第3到第7个: {numbers[2:7]}")
print(f"每隔一个取一个: {numbers[::2]}")
print(f"反转: {numbers[::-1]}")

# 列表推导式 (Python 特色)
print("\n--- 列表推导式 ---")
squares = [x**2 for x in range(10)]
print(f"0-9的平方: {squares}")

even_squares = [x**2 for x in range(10) if x % 2 == 0]
print(f"偶数的平方: {even_squares}")

# 2. 元组 Tuple (不可变列表)
print("\n--- 元组 Tuple ---")
coordinates = (10, 20)
point = 30, 40                    # 括号可省略
single_element = (42,)            # 单元素元组需要逗号

print(f"坐标: {coordinates}")
print(f"点: {point}")
print(f"单元素元组: {single_element}")

# 元组解包
x, y = coordinates
print(f"解包: x={x}, y={y}")

# 3. 字典 Dictionary (类似 Java HashMap)
print("\n--- 字典 Dictionary ---")

# 创建字典
person = {
    "name": "John",
    "age": 30,
    "city": "New York",
    "hobbies": ["reading", "swimming"]
}

print(f"个人信息: {person}")

# 字典操作
person["job"] = "Developer"      # 添加/修改
print(f"添加工作: {person}")

person["age"] = 31               # 修改
print(f"修改年龄: {person}")

del person["city"]               # 删除
print(f"删除城市: {person}")

# 字典方法
print(f"所有键: {list(person.keys())}")
print(f"所有值: {list(person.values())}")
print(f"所有键值对: {list(person.items())}")

# 安全获取值
age = person.get("age", "未知")    # 如果键不存在返回默认值
country = person.get("country", "未知")
print(f"年龄: {age}")
print(f"国家: {country}")

# 字典推导式
print("\n--- 字典推导式 ---")
square_dict = {x: x**2 for x in range(5)}
print(f"数字平方字典: {square_dict}")

# 4. 集合 Set (类似 Java HashSet)
print("\n--- 集合 Set ---")
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}

print(f"集合1: {set1}")
print(f"集合2: {set2}")
print(f"并集: {set1 | set2}")      # 或 set1.union(set2)
print(f"交集: {set1 & set2}")      # 或 set1.intersection(set2)
print(f"差集: {set1 - set2}")      # 或 set1.difference(set2)
print(f"对称差集: {set1 ^ set2}")  # 或 set1.symmetric_difference(set2)

# 集合操作
set1.add(6)
print(f"添加6: {set1}")

set1.remove(1)  # 如果元素不存在会报错
print(f"删除1: {set1}")

set1.discard(10)  # 安全删除，元素不存在不会报错
print(f"安全删除10: {set1}")

# 5. 复杂数据结构嵌套
print("\n--- 复杂数据结构 ---")
students = [
    {"name": "Alice", "age": 20, "grades": [85, 90, 78]},
    {"name": "Bob", "age": 22, "grades": [92, 88, 95]},
    {"name": "Charlie", "age": 21, "grades": [76, 85, 80]}
]

print("学生信息:")
for student in students:
    print(f"  姓名: {student['name']}, 年龄: {student['age']}, 平均分: {sum(student['grades'])/len(student['grades']):.1f}")

# 6. 与 Java 对比
print("\n--- 与 Java 对比 ---")
"""
Java 数据结构对比:

// 列表 (ArrayList)
List<String> fruits = new ArrayList<>();
fruits.add("apple");
fruits.add("banana");
fruits.remove("banana");

// 映射 (HashMap)
Map<String, Object> person = new HashMap<>();
person.put("name", "John");
person.put("age", 30);
person.remove("city");

// 集合 (HashSet)
Set<Integer> set1 = new HashSet<>();
set1.add(1);
set1.add(2);
set1.remove(1);

// Java 没有内置的元组和推导式
"""

if __name__ == "__main__":
    print("\n=== 数据结构学习完成 ===")